package com.imooc.coupon.support.vo;

import com.imooc.coupon.constant.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

/**
 * 优惠券规则定义
 * Created By TINY
 * Create Time 2020/2/9 - 15:51
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TemplateRule {

    /** 优惠券过期规则 */
    private Expiration expiration;

    /** 折扣 */
    private Discount discount;

    /** 每用户最多可以领取几张优惠券 */
    private Integer limitation;

    /** 优惠券使用范围 */
    private UsageScope usageScope;

    /** 权重，优惠券可以跟哪些优惠券叠加使用（相同类型的优惠券不能叠加）；保存优惠券唯一编码 */
    private String weight;

    // 基础数据校验
    public boolean validate() {
        return expiration.validate() && discount.validate()
                && limitation > 0 && usageScope.validate()
                && StringUtils.isNotEmpty(weight);
    }

    /**
     * 优惠券有效期
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Expiration {

        /** 有效期类型，对应PeriodType中的code */
        private Integer period;

        /** 有效间隔，只对变动（SHIFT）类型有效期有效 */
        private Integer gap;

        /** 优惠券的失效日期，对两种有效期类型都生效 */
        private Long deadLine;

        boolean validate() {
            // 简单校验
            return null != PeriodType.of(period) && gap > 0 && deadLine > 0;
        }
    }

    /**
     * 优惠券折扣，需要与优惠券类型配合决定
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Discount {

        /** 额度，配合类型决定 */
        private Integer quota;

        /** 基准额度，需要满多少才可用 */
        private Integer base;

        boolean validate() { return quota > 0 && base > 0; }
    }

    /**
     * 优惠券可用范围
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UsageScope {

        /** 省份 */
        private String province;

        /** 城市 */
        private String city;

        /** 优惠券可用的商品类型 */
        private String goodsType;

        boolean validate() {
            return StringUtils.isNotEmpty(province) && StringUtils.isNotEmpty(city)
                    && StringUtils.isNotEmpty(goodsType);
        }
    }
}
